﻿using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Text;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Globalization;
using NSoup.Nodes;
using WinFormDemo.Helper;

namespace RSSP1
{
    public partial class HD_MainForm : Form
    {
        static UInt32 Rssp1Cycle = 0;
        static Dictionary<string, string> EquInfo = new Dictionary<string, string>();
        static HD_MainForm MainForm      = null;
        static IPEndPoint  LocIpEndPoint = null;
        static IPEndPoint  RmtIpEndPoint = null;
        static Socket      Socket = null;
        static Thread      TmierSndThread = HD_Thread.TRD_GetThread(TmierSndTask);
        static Thread      TmierRecThread = HD_Thread.TRD_GetThread(TmierRecTask);
        static int         TmierSndThreadTime = 0;
        static int         TxNum = 0;
        static int         RxNum = 0;
        static bool        TmierSndThreadRunFlag = false;
        static bool        TmierRecThreadRunFlag = false;
        static bool        RandomFlag = false;
        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             HD_MainForm
        *  @brief          主窗口构造函数
        *  @detail         窗体应用对象创建时访问，由系统自动创建，开发人员不需要创建
        *  @param[in]      无
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public HD_MainForm()
        {
            MainForm = this;
            /** 初始化窗体应用*/
            InitializeComponent();
            InitIpAndPort();
            InitEquSelect();
            InitDocShow();
            HD_Rssp1.HD_InitRssp1Conn();
            ProgressBar.CheckForIllegalCrossThreadCalls = false;
            HD_Thread.TRD_StartThread(TmierSndThread);
            HD_Thread.TRD_StartThread(TmierRecThread);
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             InitEquSelect
        *  @brief          初始化下拉框
        *  @detail         窗体创建后，初始化下拉框并绑定数据，数据来源为INI文件定义
        *  @param[in]      无
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static void InitEquSelect()
        {
            /** 设置下拉框只能下拉，不能编辑*/
            MainForm.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
            MainForm.comboBox2.DropDownStyle = ComboBoxStyle.DropDownList;
            /** 下拉框数据源文件路径*/
            String IniFilePath = System.Windows.Forms.Application.StartupPath + HD_IniFile.IniFilePath;
            /** 获取下拉框部分所有数据*/
            string[] Equs = HD_IniFile.ReadKeys(HD_IniFile.EquNameAndId, IniFilePath);
            /** 遍历所有数据，放入本地MAP结构中，后面做搜索处理*/
            for (int i = 0; i < Equs.Length; i++)
            {
                /** 数据存储格式为key=value，需要拆分获取key和value的值，作为map的key和value进行存储*/
                string[] Equ = Equs[i].Trim().Split("=");
                /** 存储到MAP结构中*/
                EquInfo.Add(Equ[0], Equ[1]);
                /** 设置下拉框下拉值*/
                MainForm.comboBox1.Items.Add(Equ[0]);
                MainForm.comboBox2.Items.Add(Equ[0]);
            }
            /** 设置下拉框默认选中值*/
            MainForm.comboBox1.SelectedIndex = 0;
            MainForm.comboBox2.SelectedIndex = 1;
            /** 根据下拉框选择的设备信息，进行初始化RSSP1连接*/
            UInt32 SrcId = UInt32.Parse(GetEquIdByEquName(MainForm.comboBox1, MainForm.textBox10), NumberStyles.AllowHexSpecifier);
            UInt32 DstId = UInt32.Parse(GetEquIdByEquName(MainForm.comboBox2, MainForm.textBox11), NumberStyles.AllowHexSpecifier);
            HD_Rssp1.HD_AddRssp1Conn(SrcId, DstId);
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             GetEquIdByEquName
        *  @brief          根据设备名称获取设备ID
        *  @detail         按照MAP结构定义，通过下拉框选中的设备的名称获取设备的协议ID，并更新下拉框选择项
        *  @param[in]      comboBox    设备下拉框对象
        *  @param[in]      textBox     设备ID显示对象
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static string GetEquIdByEquName(ComboBox comboBox,TextBox textBox)
        {
            /** 遍历设备信息MAP结构*/
            foreach (var item in EquInfo)
            {
                /** 获取下拉框选择的设备名称获取设备ID*/
                if (item.Key.Equals(comboBox.Text))
                {
                    /** 更新设备ID显示*/
                    textBox.Text = item.Value;
                    /** 返回设备ID号*/
                    return item.Value;
                }
            }
            /** 查询失败，返回无效设备ID号*/
            return "";
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             InitIpAndPort
        *  @brief          初始化IP和端口配置
        *  @detail         查询INI文件中存储的本地和远程的IP和端口号
        *  @param[in]      无
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static void InitIpAndPort()
        {
            /** IP和端口数据源文件路径*/
            String IniFilePath = System.Windows.Forms.Application.StartupPath+HD_IniFile.IniFilePath;
            /** 读取本地和远程的IP和端口号信息，读取失败，IP配置为127.0.0.1，端口号配置为8080*/
            String LocIp = HD_IniFile.Read(HD_IniFile.IpAndPortSection, "LocIp", "127.0.0.1", IniFilePath);
            string RmtIp = HD_IniFile.Read(HD_IniFile.IpAndPortSection, "RmtIp", "127.0.0.1", IniFilePath);
            string LocPort = HD_IniFile.Read(HD_IniFile.IpAndPortSection, "LocPort", "8080", IniFilePath);
            string RmtPort = HD_IniFile.Read(HD_IniFile.IpAndPortSection, "RmtPort", "8080", IniFilePath);
            /** 更新IP和端口号显示*/
            MainForm.textBox1.Text = LocIp;
            MainForm.textBox2.Text = RmtIp;
            MainForm.textBox3.Text = LocPort;
            MainForm.textBox4.Text = RmtPort;
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             SaveIpAndPort
        *  @brief          保存IP和端口配置
        *  @detail         获取页面中连接成功后的IP和端口号，将数据保存到INI文件中，便于第二次启动时为最后一次修改
        *                  的值
        *  @param[in]      无
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static void SaveIpAndPort()
        {
            /** IP和端口数据源文件路径*/
            String IniFilePath = System.Windows.Forms.Application.StartupPath+HD_IniFile.IniFilePath;
            /** 删除INI文件中IP端口号的段*/
            HD_IniFile.DeleteSection(HD_IniFile.IpAndPortSection, IniFilePath);
            /** 获取页面中本地和远程的IP和端口号*/
            String LocIp = MainForm.textBox1.Text;
            string RmtIp = MainForm.textBox2.Text;
            string LocPort = MainForm.textBox3.Text;
            string RmtPort = MainForm.textBox4.Text;
            /** 更新页面中的数据到INI文件中*/
            HD_IniFile.Write(HD_IniFile.IpAndPortSection, "LocIp", LocIp, IniFilePath);
            HD_IniFile.Write(HD_IniFile.IpAndPortSection, "RmtIp", RmtIp, IniFilePath);
            HD_IniFile.Write(HD_IniFile.IpAndPortSection, "LocPort", LocPort, IniFilePath);
            HD_IniFile.Write(HD_IniFile.IpAndPortSection, "RmtPort", RmtPort, IniFilePath);
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             TmierSndTask
        *  @brief          定时器发送任务
        *  @detail         任务负责处理UDP发送RSSP1的数据，并进行RSSP1发送数据处理，发送周期可配置，配置时间为
        *                  1~1000ms可配置
        *  @param[in]      无
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static void TmierSndTask()
        {
            while (true)
            {
                /** 开始发送标志有效，可以控制发送停止和开始功能*/
                if (true == TmierSndThreadRunFlag)
                {   
                    /** 发送数据字符串临时遍历*/
                    string SndTextStr = "";
                    /** 注入随机数标志有效，可以控制发送数据为任意数据*/
                    if (true == RandomFlag)
                    {
                        /** 创建一包长度随机，内容随机的随机数*/
                        Random random = new Random();
                        int randomLen = random.Next(10, 20);
                        for (int i = 0; i < randomLen; i++)
                        {
                            SndTextStr += random.Next(0,10);
                        }
                    }
                    else
                    {
                        /** 随机数标志无效，获取发送区数据作为发送数据*/
                        SndTextStr = MainForm.textBox6.Text.Trim();
                    }
                    /** 将字符串数据转换为字节数据作为源发送数据*/
                    byte[] OriginSndBuff = Encoding.Default.GetBytes(SndTextStr);
                    /** RSSP1发送字节数据存储*/
                    byte[] Rssp1SndBuff = new byte[1024];
                    /** 发送数据长度*/
                    UInt16 SndLen = (UInt16)OriginSndBuff.Length;
                    /** 获取通信设备ID*/
                    UInt32 SrcId = UInt32.Parse(MainForm.textBox10.Text, NumberStyles.AllowHexSpecifier);
                    UInt32 DstId = UInt32.Parse(MainForm.textBox11.Text, NumberStyles.AllowHexSpecifier);
                    UInt32 IsSsrOrSse = 0;
                    UInt32 SndError = 0;
                    byte res = 0;
                    for (int i = 0; i < SndLen; i++)
                    {
                        Rssp1SndBuff[i] = OriginSndBuff[i];
                    }
                    /** 进行RSPP1数据打包发送*/
                    res = HD_Rssp1.HD_Rssp1Snd(SrcId, DstId,ref IsSsrOrSse, Rssp1Cycle, Rssp1SndBuff,ref SndLen,ref SndError);
                    /** 调用UDP发送接口进行数据发送*/
                    HD_UDP.UDP_SndData(Socket, RmtIpEndPoint, Rssp1SndBuff, SndLen);
                    /** 发送长度不为0，显示发送数据日志信息*/
                    if (0 != SndLen)
                    {
                        MainForm.textBox5.AppendText(Rssp1Cycle+"========================================================================\r\n");
                        MainForm.textBox5.AppendText("【"+ByteToHexStr(Rssp1SndBuff, 2) + "】【" + HD_Rssp1.RSSPI_GetRssp1Type(Rssp1SndBuff[0], Rssp1SndBuff[1]) + "】【"+ OriginSndBuff.Length + "】\r\n");
                        MainForm.textBox5.AppendText("【发送】【" + MainForm.comboBox1.Text + "=>" + MainForm.comboBox2.Text + "】\r\n");
                        MainForm.textBox5.AppendText(ByteToHexStr(Rssp1SndBuff, SndLen));
                        MainForm.textBox5.AppendText("\r\n");
                        MainForm.textBox5.AppendText("==============================================================================\r\n");
                        
                    }
                    /** 更新发送数据计数*/
                    TxNum++;
                    MainForm.textBox8.Text = TxNum.ToString();
                    /** 更新本地周期计数，模拟系统周期*/
                    Rssp1Cycle++;
                    /** 发送周期控制*/
                    Thread.Sleep(TmierSndThreadTime);
                }
            }
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             TmierRecTask
        *  @brief          定时器接收任务
        *  @detail         任务负责处理UDP接收RSSP1的数据，并进行RSSP1接收数据处理
        *  @param[in]      无
        *  @param[out]     无
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static void TmierRecTask()
        {
            /** 接收端口信息配置（任意IP和端口号，监听所有）*/
            EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                /** 开始接收标志有效，可以控制接收停止和开始功能*/
                if (true == TmierRecThreadRunFlag)
                {
                    /** 源接收数据和RSSP1数据存储区*/
                    byte[] OriginRecData = new byte[1024];
                    byte[] Rssp1RecData = new byte[1024];
                    /** 调用UDP接收驱动进行数据接收*/
                    UInt16 RecLen = (UInt16)HD_UDP.UDP_RecData(Socket, ref endPoint, ref OriginRecData);
                    UInt16 RoiginLen = RecLen;
                    UInt32 RecError = 0;
                    byte RecFlag = 0;
                    /** 接收数据长度有效*/
                    if (0 < RecLen)
                    {
                        for (int i = 0; i < RecLen; i++)
                        {
                            Rssp1RecData[i] = OriginRecData[i];
                        }
                        /** 获取通信设备信息*/
                        UInt32 SrcId = UInt32.Parse(MainForm.textBox10.Text, NumberStyles.AllowHexSpecifier);
                        UInt32 DstId = UInt32.Parse(MainForm.textBox11.Text, NumberStyles.AllowHexSpecifier);
                        /** 进行RSPP1数据接收处理*/
                        HD_Rssp1.HD_Rssp1Rec(SrcId, DstId, Rssp1Cycle, Rssp1RecData, ref RecLen, ref RecError, ref RecFlag);
                        /** 更新接收数据计数*/
                        RxNum++;
                        /** 显示接收数据日志信息*/
                        MainForm.textBox9.Text = RxNum.ToString();
                        MainForm.textBox5.AppendText(Rssp1Cycle + "========================================================================\r\n");
                        MainForm.textBox5.AppendText("【" + ByteToHexStr(OriginRecData, 2) + "】【" + HD_Rssp1.RSSPI_GetRssp1Type(OriginRecData[0], OriginRecData[1]) + "】【" + RoiginLen + "】\r\n");
                        MainForm.textBox5.AppendText("【接收】【" + MainForm.comboBox1.Text + "<=" + MainForm.comboBox2.Text + "】\r\n");
                        MainForm.textBox5.AppendText(ByteToHexStr(Rssp1RecData, RecLen));
                        MainForm.textBox5.AppendText("\r\n");
                        MainForm.textBox5.AppendText("==============================================================================\r\n");
                    }
                    /** 接收周期控制*/
                    Thread.Sleep(2);
                }
                else
                {
                    Thread.Sleep(1);
                }
            }
        }

        /*********************************************************************************************************
        *  @file           HD_MainForm.cs
        *  @fn             ByteToHexStr
        *  @brief          字节数据转字符串数据
        *  @detail         输入字节数据数组，函数返回数据十六进制的字符串
        *  @param[in]      bytes       字节数据数组
        *  @param[in]      len         字节数据长度
        *  @param[out]     无
        *  @return         string      数据十六进制字符串
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static string ByteToHexStr(byte[] bytes,int len)
        {
            /** 字符串数据变量定义*/
            string returnStr = "";
            /** 输入数据合法*/
            if (bytes != null)
            {
                /** 遍历所有字节数据，单个数据进行十六进制显示，两两数据之间空格隔开*/
                for (int i = 0; i < len; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                    returnStr += " ";
                }
            }
            /** 返回转换完成的数据字符串*/
            return returnStr;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if ("连接".Equals(button1.Text))
            {
                /** 获取本地IP信息和端口信息*/
                string LocIp = textBox1.Text.Trim();
                if ("".Equals(LocIp))
                {
                    HD_MessageBox.Show(this, "本地IP地址不能为空", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    roundButton1.BackColor = Color.Red;
                    return;
                }
                string Match = @"^((1?([1-9]\d?)|(1\d{2})|(2[0,1]\d)|(22[0-3])))(.((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))){3}$";
                bool res = Regex.IsMatch(LocIp, Match);
                if (false == res)
                {
                    HD_MessageBox.Show(this, "请输入正确的本地IP地址", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    roundButton1.BackColor = Color.Red;
                    return;
                }
                string LocPortStr = textBox3.Text.Trim();
                if ("".Equals(LocPortStr))
                {
                    HD_MessageBox.Show(this, "本地端口号不能为空", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    roundButton1.BackColor = Color.Red;
                    return;
                }
                Match = @"^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$";
                res = Regex.IsMatch(LocPortStr, Match);
                if (false == res)
                {
                    HD_MessageBox.Show(this, "请输入正确的本地端口号", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    roundButton1.BackColor = Color.Red;
                    return;
                }
                int LocPort = int.Parse(LocPortStr);
                LocIpEndPoint = HD_UDP.UDP_SetLocIpEndPoint(LocIp, LocPort);
                Socket = HD_UDP.UDP_GetSocket(LocIpEndPoint);
                /** 获取远程IP信息和端口信息*/
                string RmtIp = textBox2.Text.Trim();
                if ("".Equals(RmtIp))
                {
                    HD_MessageBox.Show(this, "远程IP地址不能为空", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                Match = @"^((1?([1-9]\d?)|(1\d{2})|(2[0,1]\d)|(22[0-3])))(.((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))){3}$";
                res = Regex.IsMatch(RmtIp, Match);
                if (false == res)
                {
                    HD_MessageBox.Show(this, "请输入正确的远程IP地址", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                string RmtPortStr = textBox4.Text.Trim();
                if ("".Equals(RmtPortStr))
                {
                    HD_MessageBox.Show(this, "远程端口号不能为空", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                Match = @"^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$";
                res = Regex.IsMatch(RmtPortStr, Match);
                if (false == res)
                {
                    HD_MessageBox.Show(this, "请输入正确的远程端口号", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                int RmtPort = int.Parse(RmtPortStr);
                if (null == Socket)
                {
                    HD_MessageBox.Show(this, "请创建UDP连接", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                RmtIpEndPoint = HD_UDP.UDP_SetRmtIpEndPoint(RmtIp, RmtPort);
                if (null != LocIpEndPoint)
                {
                    button1.Text = "断开";
                    roundButton1.BackColor = Color.Green;
                    textBox1.ReadOnly = true;
                    textBox3.ReadOnly = true;
                    textBox2.ReadOnly = true;
                    textBox4.ReadOnly = true;
                    comboBox1.Enabled = false;
                    comboBox2.Enabled = false;
                }
                SaveIpAndPort();
                UInt32 SrcId = UInt32.Parse(GetEquIdByEquName(MainForm.comboBox1, MainForm.textBox10), NumberStyles.AllowHexSpecifier);
                UInt32 DstId = UInt32.Parse(GetEquIdByEquName(MainForm.comboBox2, MainForm.textBox11), NumberStyles.AllowHexSpecifier);
                HD_Rssp1.HD_AddRssp1Conn(SrcId, DstId);
            }
            else
            {
                button1.Text = "连接";
                textBox1.ReadOnly = false;
                textBox3.ReadOnly = false;
                textBox2.ReadOnly = false;
                textBox4.ReadOnly = false;
                textBox7.ReadOnly = false;
                comboBox1.Enabled = true;
                comboBox2.Enabled = true;
                button3.BackColor = SystemColors.ControlDarkDark;
                button3.Text = "定时发送";
                button7.BackColor = SystemColors.ControlDarkDark;
                button7.Text = "开始接收";
                TmierSndThreadRunFlag = false;
                TmierRecThreadRunFlag = false;
                roundButton1.BackColor = Color.Red;
                HD_UDP.UDP_CloseSocket(Socket);
                LocIpEndPoint = null;
                RmtIpEndPoint = null;
                HD_Rssp1.HD_InitRssp1Conn();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (null == RmtIpEndPoint)
            {
                HD_MessageBox.Show(this, "请创建连接", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                return;
            }
            string SndTextStr = "";
            if (false == RandomFlag)
            {
                SndTextStr = textBox6.Text.Trim();
                if ("".Equals(SndTextStr))
                {
                    HD_MessageBox.Show(this, "请输入发送内容", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
            }
            if (true == RandomFlag)
            {
                Random random = new Random();
                int randomLen = random.Next(10, 20);
                for (int i = 0; i < randomLen; i++)
                {
                    SndTextStr += random.Next(0, 10);
                }
            }
            else
            {
                SndTextStr = MainForm.textBox6.Text.Trim();
            }
            /** 将字符串数据转换为字节数据作为源发送数据*/
            byte[] OriginSndBuff = Encoding.Default.GetBytes(SndTextStr);
            /** RSSP1发送字节数据存储*/
            byte[] Rssp1SndBuff = new byte[1024];
            /** 发送数据长度*/
            UInt16 SndLen = (UInt16)OriginSndBuff.Length;
            /** 获取通信设备ID*/
            UInt32 SrcId = UInt32.Parse(MainForm.textBox10.Text, NumberStyles.AllowHexSpecifier);
            UInt32 DstId = UInt32.Parse(MainForm.textBox11.Text, NumberStyles.AllowHexSpecifier);
            UInt32 IsSsrOrSse = 0;
            UInt32 SndError = 0;
            byte res = 0;
            for (int i = 0; i < SndLen; i++)
            {
                Rssp1SndBuff[i] = OriginSndBuff[i];
            }
            /** 进行RSPP1数据打包发送*/
            res = HD_Rssp1.HD_Rssp1Snd(SrcId, DstId, ref IsSsrOrSse, Rssp1Cycle, Rssp1SndBuff, ref SndLen, ref SndError);
            /** 调用UDP发送接口进行数据发送*/
            HD_UDP.UDP_SndData(Socket, RmtIpEndPoint, Rssp1SndBuff, SndLen);
            /** 发送长度不为0，显示发送数据日志信息*/
            if (0 != SndLen)
            {
                MainForm.textBox5.AppendText(Rssp1Cycle + "========================================================================\r\n");
                MainForm.textBox5.AppendText("【" + ByteToHexStr(Rssp1SndBuff, 2) + "】【" + HD_Rssp1.RSSPI_GetRssp1Type(Rssp1SndBuff[0], Rssp1SndBuff[1]) + "】【" + OriginSndBuff.Length + "】\r\n");
                MainForm.textBox5.AppendText("【发送】【" + MainForm.comboBox1.Text + "=>" + MainForm.comboBox2.Text + "】\r\n");
                MainForm.textBox5.AppendText(ByteToHexStr(Rssp1SndBuff, SndLen));
                MainForm.textBox5.AppendText("\r\n");
                MainForm.textBox5.AppendText("==============================================================================\r\n");

            }
            /** 更新发送数据计数*/
            TxNum++;
            MainForm.textBox8.Text = TxNum.ToString();
            /** 更新本地周期计数，模拟系统周期*/
            Rssp1Cycle++;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if ("定时发送".Equals(button3.Text))
            {
                if (null == LocIpEndPoint)
                {
                    HD_MessageBox.Show(this, "请创建连接", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                if ("".Equals(textBox7.Text.Trim()))
                {
                    HD_MessageBox.Show(this, "请输入定时时间", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                string TimeStr = textBox7.Text;
                string Match = @"^(?:[0-9]{1,3}|1000)$";
                bool res = Regex.IsMatch(TimeStr, Match);
                if (false == res)
                {
                    HD_MessageBox.Show(this, "请输入1-1000的定时时间", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                    return;
                }
                TmierSndThreadTime = int.Parse(textBox7.Text);
                TmierSndThreadRunFlag = true;
                button3.Text = "停止发送";
                button3.BackColor = Color.Green;
                textBox7.ReadOnly = true;
            }
            else
            {
                textBox7.ReadOnly = false;
                button3.Text = "定时发送";
                button3.BackColor = SystemColors.ControlDarkDark;
                TmierSndThreadRunFlag = false;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            textBox6.Text = "";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            textBox5.Text = "";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if ("注入随机".Equals(button6.Text))
            {
                button6.Text = "停止随机";
                button6.BackColor = Color.Green;
                RandomFlag = true;
            }
            else
            {
                button6.Text = "注入随机";
                button6.BackColor = SystemColors.ControlDarkDark;
                RandomFlag = false;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (null == LocIpEndPoint)
            {
                HD_MessageBox.Show(this, "请创建连接", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                return;
            }
            if ("开始接收".Equals(button7.Text))
            {
                TmierRecThreadRunFlag = true;
                button7.BackColor = Color.Green;
                button7.Text = "停止接收";
            }
            else
            {
                TmierRecThreadRunFlag = false;
                button7.BackColor = SystemColors.ControlDarkDark;
                button7.Text = "开始接收";
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if ("通信原理".Equals(button8.Text))
            {
                button8.Text = "关闭";
                button8.BackColor = Color.Green;
                this.Width = 1630;
            }
            else
            {
                button8.Text = "通信原理";
                button8.BackColor = SystemColors.ControlDarkDark;
                this.Width = 915;
            }
        }

        private void button10_Click(object sender, EventArgs e)
        {
            textBox8.Text = "0";
            textBox9.Text = "0";
            TxNum = 0;
            RxNum = 0;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            GetEquIdByEquName(MainForm.comboBox1, MainForm.textBox10);
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            GetEquIdByEquName(MainForm.comboBox2, MainForm.textBox11);
        }

        private void HD_MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                /*关闭开启的线程*/
                
                /*关闭开启的端口*/
                if (null != Socket)
                {
                    HD_UDP.UDP_CloseSocket(Socket);
                }
                System.Diagnostics.Process.GetCurrentProcess().Kill();
                Thread.CurrentThread.Abort();
                if (null != TmierSndThread)
                {
                    TmierSndThread.Abort();
                }
                if (null != TmierRecThread)
                {
                    TmierRecThread.Abort();
                }
                Environment.Exit(0);
            }
            catch
            {

            }
        }

        public void InitDocShow()
        {            string DocFile = System.Windows.Forms.Application.StartupPath + "";
            HD_RTF.RTF_LoadFileToRichTextBox(MainForm.richTextBox1, DocFile + HD_RTF.RtfPath);
        }
    }
}
